#include "SPI_INIT.h"  
#include "usart.h"

u8 delay_time=1;

void SPI1_IO_init(void)
{
    GPIO_InitTypeDef GPIO_Initure;	
	__HAL_RCC_GPIOF_CLK_ENABLE();	
	
	GPIO_Initure.Speed= GPIO_SPEED_LOW;//GPIO_SPEED_HIGH;     //¸ßËÙ
	GPIO_Initure.Pull = GPIO_PULLUP;
	GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;	

	GPIO_Initure.Pin = SPI1_SCK;				
	HAL_GPIO_Init(SPI1_SCK_Periph_GPIO,&GPIO_Initure); //	CLK
			
	GPIO_Initure.Pin = SPI1_MOSI;				
	HAL_GPIO_Init(SPI1_MOSIPeriph_GPIO,&GPIO_Initure);//	MOSI
	
	GPIO_Initure.Pin = Mipi2832_CS1;//	CS1			
	HAL_GPIO_Init(Mipi2832_CS_Periph_GPIO,&GPIO_Initure);//	
	
	GPIO_Initure.Pin = Mipi283228_DC;//	Mipi2832_28 SDC
	HAL_GPIO_Init(Mipi283228_DC_Periph_GPIO,&GPIO_Initure);

//	GPIO_Initure.Pin = M25P64_CS0;//	CS0
//	HAL_GPIO_Init(M25P64_CS_Periph_GPIO,&GPIO_Initure);
	
	GPIO_Initure.Mode=GPIO_MODE_INPUT;
	GPIO_Initure.Pin=SPI1_MISO;					//	MISO
	HAL_GPIO_Init(SPI1_MISO_Periph_GPIO,&GPIO_Initure);
	
}

void SPI_CS_Select(u8 channel,u8 enable)
{
    if(enable == 0)
    {
            HAL_GPIO_WritePin( Mipi2832_CS_Periph_GPIO,  Mipi2832_CS1 ,GPIO_PIN_RESET);	//CS1_CLR
    }
    else if(enable == 1)
    {
            HAL_GPIO_WritePin( Mipi2832_CS_Periph_GPIO,  Mipi2832_CS1 ,GPIO_PIN_SET);	//CS1_SET  
    }
}

void SPI_4L_DCX_Select(u8 channel,u8 enable)
{
    if(enable == 0)
    {
        HAL_GPIO_WritePin( Mipi283228_DC_Periph_GPIO,  Mipi283228_DC,GPIO_PIN_RESET);	//LCD_DCX1_CLR;
    }
    else if(enable == 1)
    {
        HAL_GPIO_WritePin( Mipi283228_DC_Periph_GPIO,  Mipi283228_DC,GPIO_PIN_SET);	//LCD_DCX1_SET;  
    }
}

/*****************************************************
    三线8bit
    写命令         2832通信用
*******************************************************/

void SPI_Write_u8_Cmd(u8 SPI_Mode,u8 channel,u8 cmd)
{
	u8 i;
	SPI_CS_Select(channel,0);
  delay_6ns(delay_time);  
    if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;	
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
				delay_6ns(delay_time);
        HAL_GPIO_WritePin	( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_4L_DCX_Select(channel,0);       //DCX = 0 表示 命令
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    }
  	delay_6ns(delay_time);
	for (i = 0; i < 8; ++i)
	{
		if (cmd & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		cmd <<= 1;
		
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
	  delay_6ns(delay_time);
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
	  delay_6ns(delay_time);
	}
	SPI_CS_Select(channel,1);
	delay_6ns(delay_time);
}

void SPI_Write_u8_Cmd_NoCS(u8 SPI_Mode,u8 cmd)
{
	u8 i;

     if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;	
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;	
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_4L_DCX_Select(CS1_2,0);       //DCX = 0 表示 命令
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    }   
	for (i = 0; i < 8; ++i)
	{
		if (cmd & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		cmd <<= 1;
		
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		delay_6ns(1);
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;	
	}
}


/*****************************************************
    三线8bit
    写数据        2832通信用
*******************************************************/
void SPI_Write_u8_Data(u8 SPI_Mode,u8 channel,u8 data)
{
	u8 i;
    u8 dat = 0;
    dat = data;
	SPI_CS_Select(channel,0);
	delay_6ns(delay_time);
    if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI ,GPIO_PIN_SET);	//LCD_SDA_SET;	
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK ,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
			  delay_6ns(delay_time);
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK ,GPIO_PIN_SET);	    //LCD_SCL_SET;
			  delay_6ns(delay_time);
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_4L_DCX_Select(channel,1);       //DCX = 0 表示 命令
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    } 			
	for (i = 0; i < 8; ++i)
	{
		if (dat & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		dat <<= 1;
		
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_RESET);	//LCD_SCL_CLR;
		delay_6ns(delay_time);
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK,GPIO_PIN_SET);	//LCD_SCL_SET;
		delay_6ns(delay_time);
	}
	SPI_CS_Select(channel,1);
	delay_6ns(delay_time);
}

void SPI_Write_u8_Data_NoCS(u8 SPI_Mode,u8 data)
{
	u8 i;
    if(SPI_Mode == SPI3_Mode)
    {
        HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI ,GPIO_PIN_SET);	//LCD_SDA_SET;	
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK ,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK ,GPIO_PIN_SET);	    //LCD_SCL_SET;
    }  
    else if(SPI_Mode == SPI4_Mode)
    {
        SPI_4L_DCX_Select(CS1_2,1);       //DCX = 0 表示 命令
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK ,GPIO_PIN_RESET);	    //LCD_SCL_CLR;	
    }		
	for (i = 0; i < 8; ++i)
	{
		if (data & (1 << 7)) 	
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI ,GPIO_PIN_SET);	//LCD_SDA_SET;
		else					
			HAL_GPIO_WritePin( SPI1_MOSIPeriph_GPIO,  SPI1_MOSI ,GPIO_PIN_RESET);	//LCD_SDA_CLR;
		data <<= 1;		
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK , GPIO_PIN_RESET);	//LCD_SCL_CLR;		
		delay_6ns(delay_time);
        HAL_GPIO_WritePin	( SPI1_SCK_Periph_GPIO,  SPI1_SCK , GPIO_PIN_SET);	//LCD_SCL_SET;
		
	}
}
/*****************************************************
    三线8bit
   读8bit数据      2828通信用
*******************************************************/

u8 SPI3_Read_u8_Data(u8 channel)
{
	u8 j,value = 0;
	SPI_CS_Select(channel,0);
	for(j=0;j<8;j++) // 8 Data
	{
		HAL_GPIO_WritePin  ( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
		HAL_GPIO_WritePin	( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI1_MISO_Periph_GPIO,SPI1_MISO))
			value |= 0x01;	
	}
	SPI_CS_Select(channel,1);	
	return value; 
	    
}

u8 SPI3_Read_u8_Data_NoCS(void)
{
	u8 j,value = 0;
	for(j=0;j<8;j++) // 8 Data
	{
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
        delay_6ns(delay_time);
		HAL_GPIO_WritePin	( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI1_MISO_Periph_GPIO,SPI1_MISO))
			value |= 0x01;	
	}
	return value; 
	    
}

u8 SPI3_Read_u8_Data_NoCS_SDA(void)
{
	u8 j,value = 0;
	for(j=0;j<8;j++) // 8 Data
	{
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
		delay_6ns(delay_time);
        HAL_GPIO_WritePin	( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI1_MOSIPeriph_GPIO,SPI1_MOSI))
			value |= 0x01;	
	}
	return value; 
	    
}
/*****************************************************
    三线8bit
   读16bit数据
*******************************************************/
u16 SPI3_Read_u16_Data(u8 channel)
{
	uint8_t j;
	uint16_t value=0;
	SPI_CS_Select(channel,0);
	for(j=0;j<16;j++) // 16 Data
	{
		HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;
		
		HAL_GPIO_WritePin	( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_SET);	//LCD_SCL_SET;
		
		value<<= 1;
		if(HAL_GPIO_ReadPin(SPI1_MISO_Periph_GPIO,SPI1_MISO))
			value |= 0x01;	
	}
	SPI_CS_Select(channel,1);		
	return value;      
}
void SPI_Write_u8_Array(u8 SPI_Mode,u8 channel ,u8* para)
{
	u8 i,j;

        i = 1;
        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;

        SPI_CS_Select(channel,0);
				SPI_Write_u8_Cmd_NoCS(SPI_Mode,para[1]);
        for(j=0;j<para[0]-1;j++)
        {
            SPI_Write_u8_Data_NoCS(SPI_Mode,para[1+i+j]);
        }
        SPI_CS_Select(channel,1);
        delay_ms(1);
  
}

//void SPI_Write_u8_Array_code(u8 SPI_Mode,u8 channel ,u8* para)
//{
//	u8 i,j;

//        i = 1;
//        HAL_GPIO_WritePin( SPI1_SCK_Periph_GPIO,  SPI1_SCK, GPIO_PIN_RESET);	//LCD_SCL_CLR;

//        SPI_CS_Select(channel,0);
//		SPI_Write_u8_Cmd_NoCS(SPI_Mode,para[3]);
//        SPI_CS_Select(channel,1);
//        SPI_CS_Select(channel,0);
//        for(j=0;j<para[2]-1;j++)
//        {
//            SPI_Write_u8_Data_NoCS(SPI_Mode,para[4+j]);
//        }
//        SPI_CS_Select(channel,1);
//        delay_ms(1);
//  
//}








